/*Copyright (C) 2009 - 2011 MASSART GAUTHIER

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

#include "../headers.h"

/*
/
* 7 * 8 * 9
/
* 4 * 5 * 6
/
* 1 * 2 * 3
/
*/

/* IA de niveau 1
** Elle ne fait que se défendre
** Même en cas de gagnage imdédiat
*/
short morp_IA_1(char matrice[10]) {
	bool passe = false;
	short touche_appuyee = '0';

	if(!passe) {
		touche_appuyee = morp_IA_defense_base(matrice);
	}

	if(touche_appuyee != '0') {
		passe = true;
	}

	if(!passe) {
		touche_appuyee =  morp_IA_touche_aleatoire(matrice);
	}

	if(touche_appuyee != '0') {
		passe = true;
	}

	return touche_appuyee;
}

/* IA de niveau 2
** Elle attaque et ce défend ensuite
** Elle ne gère pas les coups imparables
*/
short morp_IA_2(char matrice[10]) {
	bool passe = false;
	short touche_appuyee = '0';

	if(!passe) {
		touche_appuyee = morp_IA_attaque_base(matrice);
	}

	if(touche_appuyee != '0') {
		passe = true;
	}

	if(!passe) {
		touche_appuyee = morp_IA_defense_base(matrice);
	}

	if(touche_appuyee != '0') {
		passe = true;
	}

	if(!passe) {
		touche_appuyee =  morp_IA_touche_aleatoire(matrice);
	}

	if(touche_appuyee != '0') {
		passe = true;
	}

	return touche_appuyee;
}

short morp_IA_3(char matrice[10]) {
	bool passe = false;
	short touche_appuyee = '0';

	if(!passe) {
		touche_appuyee = morp_IA_attaque_base(matrice);
	}

	if(touche_appuyee != '0') {
		passe = true;
	}

	if(!passe) {
		touche_appuyee = morp_IA_defense_sup(matrice);
	}

	if(touche_appuyee != '0') {
		passe = true;
	}

	if(!passe) {
		touche_appuyee = morp_IA_defense_base(matrice);
	}

	if(touche_appuyee != '0') {
		passe = true;
	}

	if(!passe) {
		touche_appuyee =  morp_IA_touche_aleatoire(matrice);
	}

	if(touche_appuyee != '0') {
		passe = true;
	}

	return touche_appuyee;
}

/* IA d'attaque basique
** Destinée à finir une de ses ligne de trois symboles
*/
short morp_IA_attaque_base(char matrice[10]) {
	bool passe = false;
	short touche_appuyee = '0';

	/*Verticale*/
	if(!passe && matrice[7] == 'O' && matrice[8] == 'O' && matrice[9] == ' ') {
		touche_appuyee = '9';
		passe = true;
	}

	if(!passe && matrice[7] == 'O' && matrice[9] == 'O' && matrice[8] == ' ') {
		touche_appuyee = '8';
		passe = true;
	}

	if(!passe && matrice[8] == 'O' && matrice[9] == 'O' && matrice[7] == ' ') {
		touche_appuyee = '7';
		passe = true;
	}

	if(!passe && matrice[4] == 'O' && matrice[5] == 'O' && matrice[6] == ' ') {
		touche_appuyee = '6';
		passe = true;
	}

	if(!passe && matrice[4] == 'O' && matrice[6] == 'O' && matrice[5] == ' ') {
		touche_appuyee = '5';
		passe = true;
	}

	if(!passe && matrice[5] == 'O' && matrice[6] == 'O' && matrice[4] == ' ') {
		touche_appuyee = '4';
		passe = true;
	}

	if(!passe && matrice[1] == 'O' && matrice[2] == 'O' && matrice[3] == ' ') {
		touche_appuyee = '3';
		passe = true;
	}

	if(!passe && matrice[1] == 'O' && matrice[3] == 'O' && matrice[2] == ' ') {
		touche_appuyee = '2';
		passe = true;
	}

	if(!passe && matrice[2] == 'O' && matrice[3] == 'O' && matrice[1] == ' ') {
		touche_appuyee = '1';
		passe = true;
	}


	/*Horizontale*/
	if(!passe && matrice[7] == 'O' && matrice[4] == 'O' && matrice[1] == ' ') {
		touche_appuyee = '1';
		passe = true;
	}

	if(!passe && matrice[8] == 'O' && matrice[5] == 'O' && matrice[2] == ' ') {
		touche_appuyee = '2';
		passe = true;
	}

	if(!passe && matrice[9] == 'O' && matrice[6] == 'O' && matrice[3] == ' ') {
		touche_appuyee = '3';
		passe = true;
	}


	if(!passe && matrice[7] == 'O' && matrice[1] == 'O' && matrice[4] == ' ') {
		touche_appuyee = '4';
		passe = true;
	}

	if(!passe && matrice[8] == 'O' && matrice[2] == 'O' && matrice[5] == ' ') {
		touche_appuyee = '5';
		passe = true;
	}

	if(!passe && matrice[9] == 'O' && matrice[3] == 'O' && matrice[6] == ' ') {
		touche_appuyee = '6';
		passe = true;
	}

	if(!passe && matrice[4] == 'O' && matrice[1] == 'O' && matrice[7] == ' ') {
		touche_appuyee = '7';
		passe = true;
	}

	if(!passe && matrice[5] == 'O' && matrice[2] == 'O' && matrice[8] == ' ') {
		touche_appuyee = '8';
		passe = true;
	}

	if(!passe && matrice[6] == 'O' && matrice[3] == 'O' && matrice[9] == ' ') {
		touche_appuyee = '9';
		passe = true;
	}


	/*Diagonale*/
	if(!passe && matrice[7] == 'O' && matrice[5] == 'O' && matrice[3] == ' ') {
		touche_appuyee = '3';
		passe = true;
	}

	if(!passe && matrice[7] == 'O' && matrice[3] == 'O' && matrice[5] == ' ') {
		touche_appuyee = '5';
		passe = true;
	}

	if(!passe && matrice[5] == 'O' && matrice[3] == 'O' && matrice[7] == ' ') {
		touche_appuyee = '7';
		passe = true;
	}

	if(!passe && matrice[9] == 'O' && matrice[5] == 'O' && matrice[1] == ' ') {
		touche_appuyee = '1';
		passe = true;
	}

	if(!passe && matrice[9] == 'O' && matrice[1] == 'O' && matrice[5] == ' ') {
		touche_appuyee = '5';
		passe = true;
	}

	if(!passe && matrice[5] == 'O' && matrice[1] == 'O' && matrice[9] == ' ') {
		touche_appuyee = '9';
		passe = true;
	}

	return touche_appuyee;
}

/* IA de défence basique
** Destinée à bloquer une des ligne de trois symboles de l'adversaire
*/
short morp_IA_defense_base(char matrice[10]) {
	bool passe = false;
	short touche_appuyee = '0';

	/*Verticale*/
	if(!passe && matrice[7] == 'X' && matrice[8] == 'X' && matrice[9] == ' ') {
		touche_appuyee = '9';
		passe = true;
	}

	if(!passe && matrice[7] == 'X' && matrice[9] == 'X' && matrice[8] == ' ') {
		touche_appuyee = '8';
		passe = true;
	}

	if(!passe && matrice[8] == 'X' && matrice[9] == 'X' && matrice[7] == ' ') {
		touche_appuyee = '7';
		passe = true;
	}

	if(!passe && matrice[4] == 'X' && matrice[5] == 'X' && matrice[6] == ' ') {
		touche_appuyee = '6';
		passe = true;
	}

	if(!passe && matrice[4] == 'X' && matrice[6] == 'X' && matrice[5] == ' ') {
		touche_appuyee = '5';
		passe = true;
	}

	if(!passe && matrice[5] == 'X' && matrice[6] == 'X' && matrice[4] == ' ') {
		touche_appuyee = '4';
		passe = true;
	}

	if(!passe && matrice[1] == 'X' && matrice[2] == 'X' && matrice[3] == ' ') {
		touche_appuyee = '3';
		passe = true;
	}

	if(!passe && matrice[1] == 'X' && matrice[3] == 'X' && matrice[2] == ' ') {
		touche_appuyee = '2';
		passe = true;
	}

	if(!passe && matrice[2] == 'X' && matrice[3] == 'X' && matrice[1] == ' ') {
		touche_appuyee = '1';
		passe = true;
	}


	/*Horizontale*/
	if(!passe && matrice[7] == 'X' && matrice[4] == 'X' && matrice[1] == ' ') {
		touche_appuyee = '1';
		passe = true;
	}

	if(!passe && matrice[8] == 'X' && matrice[5] == 'X' && matrice[2] == ' ') {
		touche_appuyee = '2';
		passe = true;
	}

	if(!passe && matrice[9] == 'X' && matrice[6] == 'X' && matrice[3] == ' ') {
		touche_appuyee = '3';
		passe = true;
	}

	if(!passe && matrice[7] == 'X' && matrice[1] == 'X' && matrice[4] == ' ') {
		touche_appuyee = '4';
		passe = true;
	}

	if(!passe && matrice[8] == 'X' && matrice[2] == 'X' && matrice[5] == ' ') {
		touche_appuyee = '5';
		passe = true;
	}

	if(!passe && matrice[9] == 'X' && matrice[3] == 'X' && matrice[6] == ' ') {
		touche_appuyee = '6';
		passe = true;
	}

	if(!passe && matrice[4] == 'X' && matrice[1] == 'X' && matrice[7] == ' ') {
		touche_appuyee = '7';
		passe = true;
	}

	if(!passe && matrice[5] == 'X' && matrice[2] == 'X' && matrice[8] == ' ') {
		touche_appuyee = '8';
		passe = true;
	}

	if(!passe && matrice[6] == 'X' && matrice[3] == 'X' && matrice[9] == ' ') {
		touche_appuyee = '9';
		passe = true;
	}


	/*Diagonales*/
	if(!passe && matrice[7] == 'X' && matrice[5] == 'X' && matrice[3] == ' ') {
		touche_appuyee = '3';
		passe = true;
	}

	if(!passe && matrice[7] == 'X' && matrice[3] == 'X' && matrice[5] == ' ') {
		touche_appuyee = '5';
		passe = true;
	}

	if(!passe && matrice[5] == 'X' && matrice[3] == 'X' && matrice[7] == ' ') {
		touche_appuyee = '7';
		passe = true;
	}

	if(!passe && matrice[9] == 'X' && matrice[5] == 'X' && matrice[1] == ' ') {
		touche_appuyee = '1';
		passe = true;
	}

	if(!passe && matrice[9] == 'X' && matrice[1] == 'X' && matrice[5] == ' ') {
		touche_appuyee = '5';
		passe = true;
	}

	if(!passe && matrice[5] == 'X' && matrice[1] == 'X' && matrice[9] == ' ') {
		touche_appuyee = '9';
		passe = true;
	}

	return touche_appuyee;
}

short morp_IA_defense_sup(char matrice[10]) {
	short touche_appuyee = '0';



	/*Teste coup imparable :
	**      ↓
	**   |x| | |
	**  →| |o| |← bloquer ici
	**   | | |x|
	**      ↑
	** bloquer ici*/

	if(((matrice[1] == 'X' && matrice[9] == 'X') || (matrice[3] == 'X' && matrice[7] == 'X')) && matrice[5] == 'O') {
		if(matrice[1] == ' ' && matrice[2] == ' ' && matrice[4] == ' ') {
			if(random(0, 1)) {
				touche_appuyee = '2';
			}
			else {
				touche_appuyee = '4';
			}
		}
		if(matrice[2] == ' ' && matrice[3] == ' ' && matrice[6] == ' ') {
			if(random(0, 1)) {
				touche_appuyee = '2';
			}
			else {
				touche_appuyee = '6';
			}
		}
		if(matrice[6] == ' ' && matrice[8] == ' ' && matrice[9] == ' ') {
			if(random(0, 1)) {
				touche_appuyee = '6';
			}
			else {
				touche_appuyee = '8';
			}
		}
		if(matrice[4] == ' ' && matrice[7] == ' ' && matrice[8] == ' ') {
			if(random(0, 1)) {
				touche_appuyee = '4';
			}
			else {
				touche_appuyee = '8';
			}
		}
	}

	return touche_appuyee;
}

/*
** Si aucune des actions précédentes n'étaient nécéssaire, une case à remplire sera désigné aléatoirement
*/
short morp_IA_touche_aleatoire(char matrice[10]) {
	bool passe = false;
	short aleatoir = 0, touche_appuyee = '0';

	while(!passe) {

		aleatoir = random(1, 9);

		if(matrice[aleatoir] == ' ') {
			aleatoir += '0';
			touche_appuyee = aleatoir;
			passe = true;
		}
	}

	return touche_appuyee;
}
